package com.bbva.cbm.web.servlet.spring.reporte;

import java.util.Date;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.ModelAndView;

import cbm.commons.BaseController;
import cbm.commons.ConstantsWeb;
import cbm.commons.SessionContainer;
import cbm.commons.UtilitarioFunciones;
import ejb.cbm.admin.entity.ParametroEntity;
import ejb.cbm.admin.entity.TransaccionEntity;
import ejb.cbm.seguridad.bean.UsuarioBean;
import ejb.com.bbva.cbm.service.ReporteService;
import ejb.com.bbva.cbm.util.Constante;
import ejb.com.bbva.cbm.util.DatosExportacion;
import ejb.com.bbva.cbm.util.ListaDisplayTag;
import ejb.com.bbva.cbm.util.Listado;
import ejb.com.bbva.cbm.util.Parametro;
import ejb.com.bbva.cbm.util.voucher.DatosVoucherOperacionCaja;

public class ReporteController extends BaseController{
	
	protected long tipoReporte;
	protected String titulo;
	protected String keyPagListado;
	protected String action;
	protected Listado lstResultadoConsulta;
	protected Parametro parametro=null;
	protected  ReporteService reporteService;
	protected int numeroRegistros;
	protected int regxPagina;
	protected int page;
	protected boolean dataHistorica=false;
	ListaDisplayTag listadoParcial;
	
	@Autowired
	public void setReporteService(ReporteService reporteService) {
		this.reporteService = reporteService;
	}
	
	
	public ReporteController() {
	}
	public ReporteController(long tipoReporte,String keyPagListado,String titulo) {
		this.tipoReporte=tipoReporte;
		this.keyPagListado=keyPagListado;
		this.titulo=titulo;		
	}	
	public  ModelAndView open(HttpServletRequest request, HttpServletResponse response){
		String paginaSig=resources.getString("reporte_principal");		
		request.setAttribute(Constante.TITULO_REPORTE, titulo);
		request.setAttribute(Constante.TIPO_REPORTE,tipoReporte);
		request.getSession().setAttribute(Constante.TITULO_REPORTE, titulo);
		request.getSession().setAttribute(Constante.TIPO_REPORTE,tipoReporte);
		request.getSession().setAttribute(Constante.REPORTE_KEY_PAG_LISTADO,keyPagListado);
		request.getSession().setAttribute(Constante.REPORTE_ACTION,action);
		request.getSession().setAttribute(Constante.DATA_HISTORICA,dataHistorica);
		String codigoOficina="";
		String oficinaVisible="";
		String codigoTerminal="";
		String terminalVisible="";
		if(!getUsuario(request).getPerfilBean().getTipoperfil().equals(Constante.PERFIL_ADMINISTRADOR)){
			codigoOficina=getOficinaId(request);
			oficinaVisible="readonly=\"readonly\" value=\""+getOficinaLabel(request)+"\"";			
		}
		if(getUsuario(request).getPerfilBean().getTipoperfil().equals(Constante.PERFIL_ASESOR_SERVICIO)){
			codigoTerminal=getTerminalId(request);
			terminalVisible="readonly=\"readonly\" value=\""+codigoTerminal+"\"";
		}
		request.getSession().setAttribute("oficinaVisible",oficinaVisible);
		request.getSession().setAttribute("codigoOficina",codigoOficina);
		request.getSession().setAttribute("codigoTerminal",codigoTerminal);
		request.getSession().setAttribute("terminalVisible",terminalVisible);
		return new ModelAndView(paginaSig);
	}
	public ModelAndView listar(HttpServletRequest request, HttpServletResponse response){
		keyPagListado=request.getSession().getAttribute(Constante.REPORTE_KEY_PAG_LISTADO)+"";
		String paginaSig=resources.getString(keyPagListado);
		listadoParcial = new ListaDisplayTag();
		listadoParcial.setFullListSize(numeroRegistros);
		listadoParcial.setList(lstResultadoConsulta);
		listadoParcial.setObjectsPerPage(regxPagina);
		listadoParcial.setPageNumber(page);		
		request.getSession().setAttribute("listadoParcial",listadoParcial);
		
		
		return new ModelAndView(paginaSig);
	}
	protected Parametro getParameter(HttpServletRequest request,HttpServletResponse response){
		SessionContainer sessionContainer = (SessionContainer)request.getSession().getAttribute(ConstantsWeb.SESSION_CONTAINER);
		UsuarioBean usuarioLogeado = (UsuarioBean)sessionContainer.getSessionElement(ConstantsWeb.USUARIO);
		Parametro parametro=new Parametro();		
		try{parametro.put("operacion",	Integer.parseInt(request.getParameter("operacion")));}catch (Exception e) {}		
		try{parametro.put("divisa",		Integer.parseInt(request.getParameter("divisa")));}catch (Exception e) {
			parametro.put("divisa",		request.getParameter("divisa"));
		}
		try{parametro.put("estadoOficina",	request.getParameter("estadoOficina"));}catch (Exception e) {}
		try{parametro.put("agencia",	request.getParameter("agencia"));}catch (Exception e) {}
		try{parametro.put("origen",		Integer.parseInt(request.getParameter("origen")));}catch (Exception e) {}
		try{parametro.put("cliente",	request.getParameter("cliente").toUpperCase());}catch (Exception e) {}
		try{parametro.put("nroTarjeta",	request.getParameter("nroTarjeta"));}catch (Exception e) {}
		try{parametro.put("oficina",	request.getParameter("oficina"));		}catch (Exception e) {}
		try{parametro.put("terminal",	request.getParameter("terminal").toUpperCase());}catch (Exception e) {}
		try{parametro.put("nroCheque",	request.getParameter("nroCheque"));}catch (Exception e) {}
		try{parametro.put("tipoMovimiento",	Integer.parseInt(request.getParameter("tipoMovimiento")));}catch (Exception e) {}
		try{parametro.put("cuenta",			request.getParameter("cuenta"));}catch (Exception e) {}
		try{parametro.put("tipoTarjeta",	request.getParameter("tipoTarjeta"));}catch (Exception e) {}
		try{parametro.put("motivo",			request.getParameter("motivo"));}catch (Exception e) {}
		try{parametro.put("nroOperacion",	request.getParameter("nroOperacion"));}catch (Exception e) {}		
		try{parametro.put("usuario",	request.getParameter("usuario").toUpperCase());}catch (Exception e) {}
		int historico= ((request.getParameter("data")+"").equals("H")?1:0);
		try{parametro.put("historico",		historico);}catch (Exception e) {}
		try{parametro.put("fechaInicio",	UtilitarioFunciones.getToDateSQL(UtilitarioFunciones.getFechaInicio(request.getParameter("fechaInicio")+"")));}catch (Exception e) {}
		try{parametro.put("fechaFin",		UtilitarioFunciones.getToDateSQL(UtilitarioFunciones.getFechaFin(request.getParameter("fechaFin")+"")));}catch (Exception e) {}
		
		
		
		page = Integer.parseInt(request.getParameter("page") == null || "".equals(request.getParameter("page")) ? "1" : request.getParameter("page"));
		regxPagina = Integer.parseInt(getServletContext().getInitParameter("pagesize"));
		int inicio=((page-1)*regxPagina)+1;
		int fin=page*regxPagina;
		try{parametro.put("p_inicio",inicio);}catch (Exception e) {}
		try{parametro.put("p_fin",fin);}catch (Exception e) {}		
		try{parametro.put("perfil",usuarioLogeado.getPerfilBean().getCodigoperfil());}catch (Exception e) {}
		
		if(usuarioLogeado.getPerfilBean().getTipoperfil().equals(Constante.PERFIL_ASESOR_SERVICIO)){
			try{parametro.put("login",usuarioLogeado.getCodigousuario());}catch (Exception e) {}
		}		
		UtilitarioFunciones.getParameter(parametro);
		return parametro;
	}
	protected DatosExportacion getDatosExportacion(HttpServletRequest request,HttpServletResponse response){
		DatosExportacion datos = new DatosExportacion();
		titulo=request.getSession().getAttribute(Constante.TITULO_REPORTE)+"";		
		
		datos.setNombreArchivo(titulo.replaceAll(" ", "_")+"_"+UtilitarioFunciones.convertirFechaHoraFormato(new Date())+".xls");
		datos.setResponse(response);
		datos.setTitulo(titulo);
		datos.setFecha(new Date());
		datos.setUsuario(getUsuario(request).getNombrecompleto());
		datos.setTipoArchivo(DatosExportacion.TIPO_ARCHIVO_EXCEL);
		return datos;
	}

	protected String getEstadoOficna(Parametro parametro,HttpServletRequest request){
		try{
			ParametroEntity pe=new ParametroEntity();
			pe.setCodigoparametro(Long.parseLong(parametro.get("estadoOficina")+""));
			int index=getCache(request).getEstadosOficina().indexOf(pe);
			return getCache(request).getEstadosOficina().get(index).getDescripcion();
		}catch (Exception e) {
			return "Todos";
		}
		
	}
	protected String getOficina(Parametro parametro,HttpServletRequest request){
		
		return parametro.get("oficina").equals("")?"Todos":parametro.get("oficina")+"";
	}
	/*
	 * 
	    ParametroEntity pe=new ParametroEntity();
		pe.setCodigoparametro(Long.parseLong(parametro.get("operacion")+""));
		int index=getCache(request).getDivisas().indexOf(pe);
		return getCache(request).getDivisas().get(index).getDescripcion();
	 */
	protected String getOperacion(Parametro parametro,HttpServletRequest request){
		try{
		TransaccionEntity te=new TransaccionEntity();		
		te.setCodigotransaccion(Long.parseLong(parametro.get("operacion")+""));
		int index=getCache(request).getConfiguracionTransacciones().indexOf(te);
		return getCache(request).getTransaccionesTodas().get(index).getDescripciontransaccion();
		}catch (NumberFormatException e) {
			return "Todos";
		}
	}
	protected String getOrigen(Parametro parametro,HttpServletRequest request){
		try{
			ParametroEntity pe=new ParametroEntity();
			pe.setCodigoparametro(Long.parseLong(parametro.get("origen")+""));
			int index=getCache(request).getDivisas().indexOf(pe);
			return getCache(request).getDivisas().get(index).getDescripcion();
		}catch (NumberFormatException e) {
			return "Todos";
		}
	}
	protected String getDivisa(Parametro parametro,HttpServletRequest request){
		try{
			ParametroEntity pe=new ParametroEntity();
			pe.setCodigoparametro(Long.parseLong(parametro.get("divisa")+""));
			int index=getCache(request).getDivisas().indexOf(pe);
			return getCache(request).getDivisas().get(index).getDescripcion();
		}catch (NumberFormatException e) {
			return "Todos";
		}
	}
	protected String getTipoTarjeta(Parametro parametro,HttpServletRequest request){
		try{
			ParametroEntity pe=new ParametroEntity();
			pe.setValoralfanumerico(parametro.get("tipoTarjeta")+"");
			int index=getCache(request).getTiposTarjeta().indexOf(pe);
			return getCache(request).getTiposTarjeta().get(index).getDescripcion();
		}catch (Exception e) {
			return "Todos";
		}
	}
	protected String getAgencia(Parametro parametro,HttpServletRequest request){
		return parametro.get("oficina").equals("")?"Todos":parametro.get("oficina")+"";
	}
	protected String getCliente(Parametro parametro,HttpServletRequest request){
		return parametro.get("cliente")+"";
	}
	protected String getNumeroTarjeta(Parametro parametro,HttpServletRequest request){
		return parametro.get("nroTarjeta")+"";
	}
	protected String getTerminal(Parametro parametro,HttpServletRequest request){
		String aux=parametro.get("terminal")+"";
		if(aux.equals("")||aux.equals("null")){
			return "Todos";
		}
		return aux;
	}
	protected String getNroCheque(Parametro parametro,HttpServletRequest request){
		return parametro.get("nroCheque")+"";
	}
	protected String getTipoMovimiento(Parametro parametro,HttpServletRequest request){
		
		return parametro.get("tipoMovimiento")==null?"Todos":parametro.get("tipoMovimiento")+"";
	}	
	protected String getCuenta(Parametro parametro,HttpServletRequest request){
		return parametro.get("cuenta")+"";
	}
	protected String getMotivo(Parametro parametro,HttpServletRequest request){
		return parametro.get("motivo")+"";
	}


	public ListaDisplayTag getListadoParcial() {
		return listadoParcial;
	}


	public void setListadoParcial(ListaDisplayTag listadoParcial) {
		this.listadoParcial = listadoParcial;
	}

	
	public ModelAndView detalleDepositoEfectivo(HttpServletRequest request, HttpServletResponse response){
		String paginaSig=resources.getString("detalle_deposito_efectivo");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			UtilitarioFunciones.setAttribute(request, reporteService.detalleDepositoEfectivo(parametro));
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	
	public ModelAndView detallePagoCuentaTarjetaCredito(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_pago_cuenta_tarjeta_credito");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			UtilitarioFunciones.setAttribute(request, reporteService.detallePagoCuentaTarjetaCredito(parametro));			
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	
	public ModelAndView detalleRetiroEfectivo(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_retiro_efectivo");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			UtilitarioFunciones.setAttribute(request, reporteService.detalleRetiroEfectivo(parametro));
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	public ModelAndView detalleBloqueoTarjeta(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_bloqueo_tarjeta");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			UtilitarioFunciones.setAttribute(request, reporteService.detalleBloqueoTarjeta(parametro));
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	public ModelAndView detallePagoCheque(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_pago_cheque_propio_banco");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			UtilitarioFunciones.setAttribute(request, reporteService.detallePagoCheque(parametro));
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	public ModelAndView detalleDepositoCheque(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_deposito_cheque");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			Object [] aux=reporteService.detalleDepositoCheque(parametro);
			UtilitarioFunciones.setAttribute(request,(HashMap<String, Object>)aux[0]);
			request.getSession().setAttribute("detalle",aux[1]);
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	public ModelAndView detalleGenerico(HttpServletRequest request, HttpServletResponse response){
		String tipo=request.getParameter("tipo");
		String muestraExtorno=request.getParameter("muestraExtorno");
		if(muestraExtorno==null||muestraExtorno.equals("")){
			request.setAttribute("muestraExtorno",1);
		}else{
			request.setAttribute("muestraExtorno",muestraExtorno);			
		}
		long lTipo=Long.parseLong(tipo);
		if(lTipo==Constante.TRANSACCION_DEPOSITO_EFECTIVO_ID){
			return detalleDepositoEfectivo(request, response);
		}else if(lTipo==Constante.TRANSACCION_PAGO_TARJETA_ID){
			return detallePagoCuentaTarjetaCredito(request, response);
		}else if(lTipo==Constante.TRANSACCION_RETIRO_EFECTIVO_ID){
			return detalleRetiroEfectivo(request, response);
		}else if(lTipo==Constante.TRANSACCION_BLOQUEO_TARJETAS){
			return detalleBloqueoTarjeta(request, response);
		}else if(lTipo==Constante.TRANSACCION_PAGO_CHEQUE_ID){
			return detallePagoCheque(request, response);		
		}else if(lTipo==Constante.TRANSACCION_DEPOSITO_CHEQUE_ID){
			return detalleDepositoCheque(request, response);		
		}else{
			return detalleAperturaCaja(request, response);
		}		
		
	}
	


	
	
	public ModelAndView detalleAperturaCaja(HttpServletRequest request, HttpServletResponse response){		
		String paginaSig=resources.getString("detalle_apertura_caja");
		try{
			HashMap<String, Object> parametro=new HashMap<String, Object>();
			parametro.put("codigoOperacion", Integer.parseInt(request.getParameter("codigoOperacion")));
			parametro.put("historico", Integer.parseInt(request.getParameter("historico")));
			
			
			DatosVoucherOperacionCaja datos=reporteService.obtenerDatosOperacionCaja(parametro);
			ParametroEntity parametroEntity=new ParametroEntity();
			parametroEntity.setCodigoparametro(datos.getTipoCajaId());			
			//CAJA O BOBEDA
			int index=getCache(request).getTiposCaja().indexOf(parametroEntity);			
			request.setAttribute("tipoCB", getCache(request).getTiposCaja().get(index));
			
			TransaccionEntity transaccionEntity=new TransaccionEntity();
			transaccionEntity.setCodigotransaccion(datos.getTipoTransaccionId());
			index=getCache(request).getTransaccionesTodas().indexOf(transaccionEntity);
			request.setAttribute("tipoOperacion", getCache(request).getTransaccionesTodas().get(index));
			
			request.setAttribute("USUARIOAUTORIZACION", datos.getUsuarioAutorizacion());
			request.setAttribute("OBSERVACIONAUTORIZACION", datos.getDescripcionAutorizacion());
			request.setAttribute("MOTIVO_TIPIFICADO_AUTO", datos.getMotivoAutorizacion());
			
			request.setAttribute("USUARIO_AUTORI_EXTOR", datos.getUsuarioExtorno());
			request.setAttribute("OBSERVACION_EXTOR", datos.getDescripcionExtorno());
			request.setAttribute("MOTIVO_TIPIFICADO_EXTOR", datos.getMotivoExtorno());
			
			request.setAttribute("datos", datos);
		}catch (Exception e) {
			guardarMensajeError(request, e);
		}
		return new ModelAndView(paginaSig);
	}
	
	
	
}
